const path = require('node:path')
const fs = require('node:fs')

/** @var server-config.local.json 文件示例 */
const serverConfigJsonExample = {
	default: {
		host: '100.100.100.1',
		port: 22,
		username: 'root',
		password: 'abc123',
	},
}

/** @var 完整的配置示例 */
const exampleConfig = {
	/** 项目根目录，必填，默认是当前文件的上两级目录 */
	root_path: null,
	/** 部署应用配置 */
	apps: {
		/** 应用标识 */
		default: {
			/** 环境标识 */
			dev: {
				/** @property {string} 必传，服务器部署目录，结尾带不带/都可以 */
				remote_dir: '/www/wwwroot/www.aaa.com/public/admin',
				/**
				 * @property {string|string[]} 必传
				 * 要上传的资源
				 * 可以是一个文件夹（必须是绝对路径），也可以是一个文件
				 * 支持glob匹配，例如：'dist/*.html' 或者 'dist/*.{js,css}'
				 * 上面的几种写法都支持数组形式传入多个，例如：['dist/*.html', 'dist/*.{js,css}']
				 */
				source: path.resolve(__dirname, '../../'),
				/** @property {boolean|object} 打包功能，设为false则不执行打包，默认false */
				build: {
					/** @property {string|string[]} 必传，要执行的打包命令，也可以是数组 */
					cmd: 'npm run build',
					/** @property {string} 执行打包命令的工作目录，不设置默认就是执行命令行的目录 */
					cwd: path.resolve(__dirname, '../../'),
				},

				/** 压缩配置，为false表示关闭，默认: false */
				zip: {
					/** @property {string} 压缩包文件名，默认：dist-temp.zip */
					file_name: 'dist-temp.zip',
					/** @property {string} 压缩包文件要放到的目录，默认：项目根目录 */
					dir: path.resolve(__dirname, '../../dist'),
				},

				/** @propperty {string} 服务器信息，默认不传则直接从 server-config.local.json 中读取【当前应用标识对应的配置】 */
				server: {
					host: 'xxx.xx.xxx.xxx', // 服务器地址
					port: 22, // 端口号
					username: 'root', // 用户名
					password: 'xxx', // 密码
				},

				/** @property {object} PM2 相关配置 */
				pm2: {
					//pm2启动配置文件名，如果不设置，默认就是 ecosystem.config.js，也可以是一个相对路径（相对于打包目录的）
					config_file_name: 'ecosystem.config.js',
					// 上传完成后要执行的指令（一般是重启pm2）
					after_cmd: 'pm2 start',
					// pm2启动配置文件内容，会在打包后自动写入到打包目录的pm2配置文件中，随项目一起上传到服务器
					config_file_content: {
						apps: [
							{
								name: 'demo-01',
								script: './server/index.mjs', // 启动文件在配置文件的相对位置
								env: {
									NITRO_PORT: 3070, // 服务启动端口
								},
							},
						],
					},
				},

				/** @property {object} 远程执行命令配置，为false关闭，默认false */
				remote_cmd: {
					/** @property {string|string[]} 要执行的远程命令，可以是一个字符串或者字符串数组 */
					cmd: 'ls -la',
					/** @property {string} 执行命令的工作目录，默认是服务器部署目录 */
					cwd: '/www/wwwroot/www.aaa.com/public/admin',
				},
			},
		},
	},
}

/** 读取本地服务器配置 */
function readLocalServerConfig(appKey) {
	const localServerConfigPath = path.join(__dirname, '../server-config.local.json')
	let localServerConfig = {}
	if (fs.existsSync(localServerConfigPath)) {
		try {
			localServerConfig = require(localServerConfigPath)[appKey] ?? {}
		} catch (error) {
			console.log('读取本地服务器配置失败，请设置server配置:', appKey)
			console.error(error)
		}
	}
	return localServerConfig
}

/**
 * 声明配置项
 * @param {object} config 配置项
 * @returns
 */
module.exports = function defineConfig(appKey, config) {
	if (!config.server) config.server = readLocalServerConfig(appKey)
	return config
}
